package linklist;
// 移除链表元素203
public class  Solution{
    public static void main(String[] args) {
        Solution c = new Solution();
        ListNode head = null;
        head = c.add(head, 1);
        c.add(head, 2);
        c.add(head, 3);
        c.add(head, 6);
        c.add(head, 2);
        c.print(head);
        c.removeElements(head, 2);
        c.print(head);
    }
//    public ListNode removeElements(ListNode head, int target) {
//
//        if (head == null) return head;
//        ListNode currentNode = head;
//        ListNode lastNode = null;
//
//        while(currentNode != null) {
//            // 不要的节点
//            if (currentNode.val == target) {
//                if (lastNode == null) {
//                    head = head.next;
//                } else {
//                    lastNode.next = currentNode.next;
//                }
//            } else {
//                if (lastNode == null) {
//                    lastNode = head;
//                } else {
//                    lastNode = lastNode.next;
//                }
//            }
//            currentNode = currentNode.next;
//        }
//        return head;
//    }
    public ListNode add(ListNode head, int val) {
        if (head == null)  {
            head = new ListNode(val);
            return head;
        }
        ListNode newNode = new ListNode( val);
        ListNode cur = head;
        while (cur.next != null) {
            cur = cur.next;
        }
        cur.next = newNode;
        return head;
    }
    private void print(ListNode head) {
        ListNode cur = head;
        while (cur != null) {
            System.out.print(cur.val);
            cur = cur.next;
        }
    }
    // 添加虚拟节点
    public ListNode removeElements(ListNode head, int target) {

        if (head == null) return head;

        ListNode curNode = head;
        ListNode preNode = new ListNode(-1, head);

        while(curNode != null) {
            if (curNode.val == target) {
                preNode.next = curNode.next;
                // 如果是第一个，那么head也要移动
                if (head == curNode) {
                    head = head.next;
                }
            } else {
                preNode = curNode;
            }
            curNode = curNode.next;
        }
        return head;
    }
}

class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) { this.val = val; }
    ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
